#ifndef __SYS_H__
#define __SYS_H__

#ifdef __cplusplus
extern "C"
{
#endif

#include "stm32f4xx_hal.h"

#define ENABLE_OS_SUPPORT 1

#define delay_ms(x) HAL_Delay(x)
#define delay_us(x) HAL_Delay_us(x)

#define CPU_FREQUENCY_HZ SystemCoreClock

/* bit操作 */
#define BIT_SET(REG, BIT) ((REG) |= (1 << (BIT)))
#define BIT_CLEAR(REG, BIT) ((REG) &= ~(1 << (BIT)))
#define BIT_READ(REG, BIT) ((REG >> (BIT)) & 1)
#define REG_MODIFY(REG, MASK, VAL) ((REG) = ((REG) & ~(MASK)) | (VAL))

    void System_Reset(void);
    /**
     * @brief HAL微妙延时函数
     * @param delay
     */
    void HAL_Delay_us(__IO uint32_t delay);
    /**
     * @brief 计算校验和并追加到数据尾部
     *
     * @param array
     * @param size
     * @return uint8_t
     */
    uint8_t ADD8_Calculation(uint8_t *array, uint16_t size);

    /**
     * @brief 校验和
     * @note 0: 成功 1: 失败
     * @param array
     * @param size
     * @return uint8_t
     */
    uint8_t ADD8_Check(uint8_t *array, uint16_t size);

    /**
     * @brief 计算CRC16并追加到数据尾部
     *
     * @param data
     * @param size
     * @return uint16_t
     */
    uint16_t CRC_Calculation(uint8_t *data, uint16_t size);

    /**
     * @brief 校验CRC16
     * @note 0: 成功 1: 失败
     * @param data
     * @param size
     * @return uint8_t
     */

    uint8_t CRC_Check(uint8_t *data, uint16_t size);
    /**
     * @brief RGB888转RGB565格式
     *
     * @param color
     * @return uint16_t
     */
    uint16_t RGB888ToRGB565(uint32_t color);
#ifdef __cplusplus
}
#endif

#endif